import Vue from "vue";
import VueRouter from "vue-router";
import routes from "./routes/routes";
import store from "../store/index";

Vue.use(VueRouter);

const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
  return originalPush.call(this, location).catch((err) => err);
};

const router = new VueRouter({
  mode: "history",
  routes,
});

// 路由前置守卫‘
//1.置一个白名单,控制哪些路由不需要登录就可以访问的
const whitePath = ["login", "home", "detail", "register", "search",'addCartSuccess'];

// 2.配置路由守卫
router.beforeEach(async (to, from, next) => {
  // 从vuex中拿到token
  const token = store.state.user.token;

  // 3.d当有token时候，
  if (token) {
    // 5. 判断我们要去的地方是不是登录页，如果是则直接回到首页
    if (to.name === "login") {
      next("/home");
    } else {
      // 6.现在有token去的不是登录页，判断我们是否拥有用户信息
      const isUserInfo = !!store.state.user.userInfo.nickName;
      if (isUserInfo) {
        next(); //又有token 又有用户信息 则完全放行
      } else {
        // 请求用户信息
        //异常处理,一旦刷新,token是持久化存的,用户信息不是持久化的,所以刷新以后一定会重新获取用户信息,一旦token过期或者token被篡改,则无法正常获取数据,此时应该清除掉已经报废的token,并且重新让用户登录
        try {
          //dispatch方法只是调用getUserInfo方法的一种方式,所以他的返回值和getUserInfo的返回值一致,都是返回promise实例
          await store.dispatch("user/getUserInfo");
          next();
        } catch (e) {
          //如果获取用户信息异常,说明token已经不能用了,需要清掉重新登录
          store.dispatch("user/resetToken");
          next("/login"); // 重新登录
        }
      }
    }
  } else {
    // 4.当前token不存在的时候
    if (whitePath.includes(to.name)) {
      next();
    } else {
      next("/login");
    }
  }
});

export default router;
